{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Implementation of Conditional GANs\n",
    "Reference: https://arxiv.org/pdf/1411.1784.pdf"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Run the comment below only when using Google Colab\n",
    "# !pip install torch torchvision"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import torch\n",
    "import torchvision\n",
    "import torch.nn as nn\n",
    "import torch.nn.functional as F"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from torch.utils.data import DataLoader\n",
    "from torchvision import datasets\n",
    "from torchvision import transforms\n",
    "from torchvision.utils import save_image"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import datetime\n",
    "import os, sys"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from matplotlib.pyplot import imshow, imsave\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "MODEL_NAME = 'ConditionalGAN'\n",
    "DEVICE = torch.device(\"cuda:0\" if torch.cuda.is_available() else \"cpu\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def to_onehot(x, num_classes=10):\n",
    "    assert isinstance(x, int) or isinstance(x, (torch.LongTensor, torch.cuda.LongTensor))\n",
    "    if isinstance(x, int):\n",
    "        c = torch.zeros(1, num_classes).long()\n",
    "        c[0][x] = 1\n",
    "    else:\n",
    "        x = x.cpu()\n",
    "        c = torch.LongTensor(x.size(0), num_classes)\n",
    "        c.zero_()\n",
    "        c.scatter_(1, x, 1) # dim, index, src value\n",
    "    return c"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def get_sample_image(G, n_noise=100):\n",
    "    \"\"\"\n",
    "        save sample 100 images\n",
    "    \"\"\"\n",
    "    img = np.zeros([280, 280])\n",
    "    for j in range(10):\n",
    "        c = torch.zeros([10, 10]).to(DEVICE)\n",
    "        c[:, j] = 1\n",
    "        z = torch.randn(10, n_noise).to(DEVICE)\n",
    "        y_hat = G(z,c).view(10, 28, 28)\n",
    "        result = y_hat.cpu().data.numpy()\n",
    "        img[j*28:(j+1)*28] = np.concatenate([x for x in result], axis=-1)\n",
    "    return img"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Discriminator(nn.Module):\n",
    "    \"\"\"\n",
    "        Simple Discriminator w/ MLP\n",
    "    \"\"\"\n",
    "    def __init__(self, input_size=784, condition_size=10, num_classes=1):\n",
    "        super(Discriminator, self).__init__()\n",
    "        self.layer = nn.Sequential(\n",
    "            nn.Linear(input_size+condition_size, 512),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(512, 256),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(256, num_classes),\n",
    "            nn.Sigmoid(),\n",
    "        )\n",
    "    \n",
    "    def forward(self, x, c):        \n",
    "        x, c = x.view(x.size(0), -1), c.view(c.size(0), -1).float()\n",
    "        v = torch.cat((x, c), 1) # v: [input, label] concatenated vector\n",
    "        y_ = self.layer(v)\n",
    "        return y_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class Generator(nn.Module):\n",
    "    \"\"\"\n",
    "        Simple Generator w/ MLP\n",
    "    \"\"\"\n",
    "    def __init__(self, input_size=100, condition_size=10, num_classes=784):\n",
    "        super(Generator, self).__init__()\n",
    "        self.layer = nn.Sequential(\n",
    "            nn.Linear(input_size+condition_size, 128),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(128, 256),\n",
    "            nn.BatchNorm1d(256),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(256, 512),\n",
    "            nn.BatchNorm1d(512),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(512, 1024),\n",
    "            nn.BatchNorm1d(1024),\n",
    "            nn.LeakyReLU(0.2),\n",
    "            nn.Linear(1024, num_classes),\n",
    "            nn.Tanh()\n",
    "        )\n",
    "        \n",
    "    def forward(self, x, c):\n",
    "        x, c = x.view(x.size(0), -1), c.view(c.size(0), -1).float()\n",
    "        v = torch.cat((x, c), 1) # v: [input, label] concatenated vector\n",
    "        y_ = self.layer(v)\n",
    "        y_ = y_.view(x.size(0), 1, 28, 28)\n",
    "        return y_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "D = Discriminator().to(DEVICE)\n",
    "G = Generator().to(DEVICE)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "transform = transforms.Compose([transforms.ToTensor(),\n",
    "                                transforms.Normalize(mean=[0.5],\n",
    "                                std=[0.5])]\n",
    ")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mnist = datasets.MNIST(root='../data/', train=True, transform=transform, download=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 64\n",
    "condition_size = 10"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "data_loader = DataLoader(dataset=mnist, batch_size=batch_size, shuffle=True, drop_last=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "criterion = nn.BCELoss()\n",
    "D_opt = torch.optim.Adam(D.parameters(), lr=0.0002, betas=(0.5, 0.999))\n",
    "G_opt = torch.optim.Adam(G.parameters(), lr=0.0002, betas=(0.5, 0.999))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "max_epoch = 30 # need more than 100 epochs for training generator\n",
    "step = 0\n",
    "n_critic = 1 # for training more k steps about Discriminator\n",
    "n_noise = 100"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "D_labels = torch.ones([batch_size, 1]).to(DEVICE) # Discriminator Label to real\n",
    "D_fakes = torch.zeros([batch_size, 1]).to(DEVICE) # Discriminator Label to fake"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "if not os.path.exists('samples'):\n",
    "    os.makedirs('samples')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {
    "scrolled": true
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Epoch: 0/30, Step: 500, D Loss: 1.036657691001892, G Loss: 0.9185525178909302\n",
      "Epoch: 1/30, Step: 1000, D Loss: 1.1014388799667358, G Loss: 1.0158565044403076\n",
      "Epoch: 1/30, Step: 1500, D Loss: 1.017891764640808, G Loss: 0.5917305946350098\n",
      "Epoch: 2/30, Step: 2000, D Loss: 1.0990983247756958, G Loss: 1.2299494743347168\n",
      "Epoch: 2/30, Step: 2500, D Loss: 0.9987165331840515, G Loss: 1.0967953205108643\n",
      "Epoch: 3/30, Step: 3000, D Loss: 1.0531857013702393, G Loss: 0.805138885974884\n",
      "Epoch: 3/30, Step: 3500, D Loss: 1.0865103006362915, G Loss: 1.1308486461639404\n",
      "Epoch: 4/30, Step: 4000, D Loss: 1.316153883934021, G Loss: 1.4331691265106201\n",
      "Epoch: 4/30, Step: 4500, D Loss: 1.2097547054290771, G Loss: 0.9566960334777832\n",
      "Epoch: 5/30, Step: 5000, D Loss: 1.3060839176177979, G Loss: 1.0760974884033203\n",
      "Epoch: 5/30, Step: 5500, D Loss: 1.1368037462234497, G Loss: 1.1087679862976074\n",
      "Epoch: 6/30, Step: 6000, D Loss: 1.2275606393814087, G Loss: 0.7947745323181152\n",
      "Epoch: 6/30, Step: 6500, D Loss: 1.2633943557739258, G Loss: 0.6697460412979126\n",
      "Epoch: 7/30, Step: 7000, D Loss: 1.1676291227340698, G Loss: 0.876056969165802\n",
      "Epoch: 8/30, Step: 7500, D Loss: 1.2297134399414062, G Loss: 1.0675418376922607\n",
      "Epoch: 8/30, Step: 8000, D Loss: 1.2598073482513428, G Loss: 1.0166195631027222\n",
      "Epoch: 9/30, Step: 8500, D Loss: 1.3194297552108765, G Loss: 1.5806450843811035\n",
      "Epoch: 9/30, Step: 9000, D Loss: 1.493754267692566, G Loss: 0.5422479510307312\n",
      "Epoch: 10/30, Step: 9500, D Loss: 1.393540620803833, G Loss: 1.2079241275787354\n",
      "Epoch: 10/30, Step: 10000, D Loss: 1.2525854110717773, G Loss: 0.844454824924469\n",
      "Epoch: 11/30, Step: 10500, D Loss: 1.4267148971557617, G Loss: 0.5226021409034729\n",
      "Epoch: 11/30, Step: 11000, D Loss: 1.3154008388519287, G Loss: 1.0357294082641602\n",
      "Epoch: 12/30, Step: 11500, D Loss: 1.2607324123382568, G Loss: 0.7632520198822021\n",
      "Epoch: 12/30, Step: 12000, D Loss: 1.2418172359466553, G Loss: 0.8889996409416199\n",
      "Epoch: 13/30, Step: 12500, D Loss: 1.3362860679626465, G Loss: 0.8968085646629333\n",
      "Epoch: 13/30, Step: 13000, D Loss: 1.2870495319366455, G Loss: 0.8639671802520752\n",
      "Epoch: 14/30, Step: 13500, D Loss: 1.313111662864685, G Loss: 0.7909728288650513\n",
      "Epoch: 14/30, Step: 14000, D Loss: 1.3023371696472168, G Loss: 0.7487360239028931\n",
      "Epoch: 15/30, Step: 14500, D Loss: 1.2976658344268799, G Loss: 0.9248465299606323\n",
      "Epoch: 16/30, Step: 15000, D Loss: 1.3270314931869507, G Loss: 0.8751394748687744\n",
      "Epoch: 16/30, Step: 15500, D Loss: 1.3797385692596436, G Loss: 0.7970761656761169\n",
      "Epoch: 17/30, Step: 16000, D Loss: 1.29557204246521, G Loss: 0.8374907374382019\n",
      "Epoch: 17/30, Step: 16500, D Loss: 1.3149912357330322, G Loss: 0.9167639017105103\n",
      "Epoch: 18/30, Step: 17000, D Loss: 1.301594853401184, G Loss: 0.8182051777839661\n",
      "Epoch: 18/30, Step: 17500, D Loss: 1.2963449954986572, G Loss: 0.7822583317756653\n",
      "Epoch: 19/30, Step: 18000, D Loss: 1.3422776460647583, G Loss: 0.8751208186149597\n",
      "Epoch: 19/30, Step: 18500, D Loss: 1.3826189041137695, G Loss: 0.7738077044487\n",
      "Epoch: 20/30, Step: 19000, D Loss: 1.3043901920318604, G Loss: 0.8847906589508057\n",
      "Epoch: 20/30, Step: 19500, D Loss: 1.3643009662628174, G Loss: 0.7579598426818848\n",
      "Epoch: 21/30, Step: 20000, D Loss: 1.3725740909576416, G Loss: 0.8713376522064209\n",
      "Epoch: 21/30, Step: 20500, D Loss: 1.3675336837768555, G Loss: 0.6800622940063477\n",
      "Epoch: 22/30, Step: 21000, D Loss: 1.328478455543518, G Loss: 0.8010445833206177\n",
      "Epoch: 22/30, Step: 21500, D Loss: 1.2901370525360107, G Loss: 0.7903639078140259\n",
      "Epoch: 23/30, Step: 22000, D Loss: 1.3740167617797852, G Loss: 0.7188965678215027\n",
      "Epoch: 24/30, Step: 22500, D Loss: 1.3559741973876953, G Loss: 0.7523510456085205\n",
      "Epoch: 24/30, Step: 23000, D Loss: 1.3947091102600098, G Loss: 0.8877040147781372\n",
      "Epoch: 25/30, Step: 23500, D Loss: 1.3366261720657349, G Loss: 0.7491698861122131\n",
      "Epoch: 25/30, Step: 24000, D Loss: 1.3519549369812012, G Loss: 0.7902757525444031\n",
      "Epoch: 26/30, Step: 24500, D Loss: 1.3612239360809326, G Loss: 0.7084876298904419\n",
      "Epoch: 26/30, Step: 25000, D Loss: 1.3272916078567505, G Loss: 0.8394737243652344\n",
      "Epoch: 27/30, Step: 25500, D Loss: 1.2812349796295166, G Loss: 0.8942346572875977\n",
      "Epoch: 27/30, Step: 26000, D Loss: 1.417182207107544, G Loss: 0.8112509250640869\n",
      "Epoch: 28/30, Step: 26500, D Loss: 1.3233587741851807, G Loss: 0.8840529918670654\n",
      "Epoch: 28/30, Step: 27000, D Loss: 1.408776044845581, G Loss: 0.7207623720169067\n",
      "Epoch: 29/30, Step: 27500, D Loss: 1.3049994707107544, G Loss: 0.780764639377594\n",
      "Epoch: 29/30, Step: 28000, D Loss: 1.344968557357788, G Loss: 0.7138490080833435\n"
     ]
    }
   ],
   "source": [
    "for epoch in range(max_epoch):\n",
    "    for idx, (images, labels) in enumerate(data_loader):\n",
    "        # Training Discriminator\n",
    "        x = images.to(DEVICE)\n",
    "        y = labels.view(batch_size, 1)\n",
    "        y = to_onehot(y).to(DEVICE)\n",
    "        x_outputs = D(x, y)\n",
    "        D_x_loss = criterion(x_outputs, D_labels)\n",
    "\n",
    "        z = torch.randn(batch_size, n_noise).to(DEVICE)\n",
    "        z_outputs = D(G(z, y), y)\n",
    "        D_z_loss = criterion(z_outputs, D_fakes)\n",
    "        D_loss = D_x_loss + D_z_loss\n",
    "        \n",
    "        D.zero_grad()\n",
    "        D_loss.backward()\n",
    "        D_opt.step()\n",
    "        \n",
    "        if step % n_critic == 0:\n",
    "            # Training Generator\n",
    "            z = torch.randn(batch_size, n_noise).to(DEVICE)\n",
    "            z_outputs = D(G(z, y), y)\n",
    "            G_loss = criterion(z_outputs, D_labels)\n",
    "\n",
    "            G.zero_grad()\n",
    "            G_loss.backward()\n",
    "            G_opt.step()\n",
    "        \n",
    "        if step % 500 == 0:\n",
    "            print('Epoch: {}/{}, Step: {}, D Loss: {}, G Loss: {}'.format(epoch, max_epoch, step, D_loss.item(), G_loss.item()))\n",
    "        \n",
    "        if step % 1000 == 0:\n",
    "            G.eval()\n",
    "            img = get_sample_image(G, n_noise)\n",
    "            imsave('samples/{}_step{}.jpg'.format(MODEL_NAME, str(step).zfill(3)), img, cmap='gray')\n",
    "            G.train()\n",
    "        step += 1"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## Sample"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.image.AxesImage at 0x219b2a6c400>"
      ]
     },
     "execution_count": 20,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x219af603080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# generation to image\n",
    "G.eval()\n",
    "imshow(get_sample_image(G, n_noise), cmap='gray')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 40,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def save_checkpoint(state, file_name='checkpoint.pth.tar'):\n",
    "    torch.save(state, file_name)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 41,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Saving params.\n",
    "save_checkpoint({'epoch': epoch + 1, 'state_dict':D.state_dict(), 'optimizer' : D_opt.state_dict()}, 'D_c.pth.tar')\n",
    "save_checkpoint({'epoch': epoch + 1, 'state_dict':G.state_dict(), 'optimizer' : G_opt.state_dict()}, 'G_c.pth.tar')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
